﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo
{
    class Program
    {
        static void Main(string[] args)
        {
            //1、定义一个方法，求一个整数数组中的 最大值，最小值，和，平均数。如果是一个方法只能有一个返回值，
            //那只能每一个都得定义一个方法来实现，不过有了ref和out这实现起来就方便多了。

            //参考步骤：
            //定义一个一维数组，数组中存放一些数据（控制台输入）。
            //定义几个变量：max、min、sum、avg

            //定义一个方法，方法返回数组元素之和,方法形参有max min avg。

            //请用ref和out各做一遍，并在注释中，描述他们的区别。

            //1.ref的做法

            //double Max = 0;
            //double Min = 0;
            //double Avg = 0;
            //double Sum = 0;

            //double[] arr = new double[5];
            //for (int i = 0; i < arr.Length; i++)
            //{
            //    Console.WriteLine("请输入第{0}个数", i + 1);
            //    arr[i] = double.Parse(Console.ReadLine());
            //}

            //Method(ref arr, ref Max, ref Min, ref Avg, ref Sum);
            //Console.WriteLine("最大值：" + Max + "|" + "最小值：" + Min + "|" + "平均值：" + Avg + "|" + "总和：" + Sum);

            //2.out的做法

            double Max;
            double Min;
            double Avg;
            double Sum;

            double[] arr = new double[5];
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine("请输入第{0}个数", i + 1);
                arr[i] = double.Parse(Console.ReadLine());
            }

            Method1(ref arr, out Max, out Min, out Avg, out Sum);
            Console.WriteLine("最大值：" + Max + "|" + "最小值：" + Min + "|" + "平均值：" + Avg + "|" + "总和：" + Sum);

            //3.ref和out区别

            //ref 的变量在调用方法前就赋值，而out在之前没有赋值。
            //语法上存在区别：
            //ref在传参时必须先初始化，而out在参数传递之前不需要初始化。

            //注：虽然out在传参之前不需要初始化，但在方法返回值之前需要进行赋值；

        }
        static void Method(ref double []arr, ref double Max, ref double Min, ref double Avg, ref double Sum) 
        {
            for (int i = 0; i < arr.Length; i++)
            {
                if (arr[0]<arr[i])
                {
                    Max = arr[i];
                }
                else
                {
                    Max = arr[0];
                }

                if (arr[0] > arr[i])
                {
                    Min = arr[i];
                }
                else
                {
                    Min = arr[0];
                }

                Sum += arr[i]; 
                
            }
            Avg = Sum / arr.Length;
        }

        static void Method1(ref double[] arr, out double Max, out double Min, out double Avg, out double Sum) 
        {
            Max = 0;
            Min = 0;
            Sum = 0;

            for (int i = 0; i < arr.Length; i++)
            {   
                if (arr[0] < arr[i])
                {
                    Max = arr[i];
                }
                else
                {
                    Max = arr[0];
                }

                if (arr[0] > arr[i])
                {
                    Min = arr[i];
                }
                else
                {
                    Min = arr[0];
                }

                Sum += arr[i];

            }
            Avg = Sum / arr.Length;
        }
    }
}
